<!DOCTYPE html>
<html lang="zh">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<title>Document</title>
</head>
<body>
	
	<script>
		/**
		 * 栈是一种遵从后进先出（LIFO）原则的有序集合。
		 * 新添加的或待删除的元素都保存在栈的末尾，称作栈顶，另一端就叫栈底。
		 * 在栈里，新元素都靠近栈顶，旧元素都接近栈底。
		 **/
		class Stack{
			constructor(){
			  this.items = [];
			}
			push(element){  //添加一个（或几个）新元素到栈顶
				this.items.push(element);
			}
			pop(){  //移除栈顶的元素，同时返回被移除的元素
				return this.items.pop();
			}
			peek(){  //返回栈顶的元素，不对栈做任何修改（这个方法不会移除栈顶的元素，仅仅返回它）
				return this.items[this.items.length-1];
			}
			isEmpty(){  //如果栈里没有任何元素就返回true，否则返回false
				return this.items.length == 0;
			}
			clear(){  //移除栈里的所有元素
				this.items = [];
			}
			size(){  //返回栈里的元素个数。这个方法和数组的length属性很类似
				return this.items.length;
			}
			print(){
				console.log(this.items.toString());
			}
		}
		//let stack = new Stack();
	
		let Stack3 = (function () {
			const items = new WeakMap();  //声明一个WeakMap类型的变量items
			class Stack3 {
				constructor () {
					items.set(this, []);  //在constructor中，以this（Stack类自己的引用）为键，把代表栈的数组存入items
				}
				push(element){
					let s = items.get(this);  //从WeakMap中取出值，即以this为键（行{2}设置的）从items中取值
					s.push(element);
				}
				pop(){
					let s = items.get(this);
					let r = s.pop();
					return r;
				}
				peek(){
					let s = items.get(this);
					return s[s.length-1];
				}
				isEmpty(){
					return items.get(this).length == 0;
				}
				size(){
					let s = items.get(this);
					return s.length;
				}
				clear(){
					items.set(this, []);
				}
				print(){
					console.log(this.toString());
				}
				toString(){
					return items.get(this).toString();
				}
			}
			return Stack3;
		})();
		//let stack3 = new Stack3();
	</script>
	<script>
		//进制转换算法 十进制转换成任何进制
		function baseConverter(decNumber, base){
			var stack = new Stack(),
					rem,
					baseString = '',
					digits = '0123456789ABCDEF';
			while(decNumber > 0){
				rem = Math.floor(decNumber % base);
				stack.push(rem);
				decNumber = Math.floor(decNumber / base);
			}
			while(!stack.isEmpty()){
				baseString += digits[stack.pop()];
			}
			return baseString;
		}
	</script>
</body>
</html>